很多學習 FP 的初學者,接觸 FP 不久,就產生了兩個很大的疑問:
- 我會用 map, filter, reduce 了,那我算是會 FP 了嗎?
- FP 的定義到底是什麼?
上述兩個問題,其實有點一體兩面,如果 FP 的定義就是 map, filter, reduce 的話,那就算是學會了。如果沒有這麼單純的話,那就…。
很可惜,這個定義並沒有單純的答案。比起 Lisp 語言的定義,函數式編程的定義相對模糊多了。首先,稱之為函數式語言的程式語言,至少分為了兩大語言系統:
所以,函數式編程的定義就會因人而異,見仁見智。有人會認為兩個語言系統取交集就算是。也有人會認為,沒有加上類型推導的話,就不算。
換言之,函數式編程的定義,就像是 Lisp 該不該積極使用 Macro 一樣,帶有爭議。
對於定義的議題,我認為,應該要把函數式編程 (FP) 看成兩個部分:概念與實作。
也基於這個分離概念與實作的觀點,我會主張:
本篇探討了函數式編程(FP)的定義,指出 FP 的定義因不同的語言系統而存在爭議,但如果我們區分概念與實作之後,可以得到一個新的觀點。
FP 的核心概念在於使用無副作用的資料轉換來進行計算,盡量減少系統狀態,並使用不可變的值。而高階函數、Monad 等,都只是協助達成這個概念的實作機制。也因此,判斷是否屬於 FP,應著重於其是否體現了無副作用和不可變值的核心精神,而非拘泥於具體的實作工具。